// 二次封装axios
// 1·引入axios
import axios from "axios";
const baseURL="http://pcapi-xiaotuxian-front-devtest.itheima.net";
// // 2·创建axios实例
// const service =axios.create({
//         baseURL:"http://elm.cangdu.org",
//         timeout:1000,
//         // headers:{
//         //     "Content-Type":"application/json;"
//         // }
//     })   
// 2·设置拦截器
    // 请求拦截====前端请求服务器数据进行拦截（此时数据还没有传给服务端）
    axios.interceptors.request.use((config)=>{
        // 在发生请求之前进行拦截 可以操作loading或者可以对 用户进行token值的判断 进行登录鉴权
        let token = localStorage.getItem("token") || null
        // let token = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ7XCJuYW1lXCI6XCJhYWFhXCIsXCJpZFwiOlwiMTM2OTU5NDk1NDczOTg1OTQ1OFwiLFwidXNlcm5hbWVcIjpcInhpYW90dXhpYW4wMDFcIn0iLCJpYXQiOjE2Nzk4ODM3MzMsImV4cCI6MTY4MDE0MjkzM30.zmQEhTaKlJKKA7FVfEdHwyUQRPtXa6tz93azRhrbYq8";
        config.headers.Authorization = token;
        // 全部接口都需要请求头携带 token
        return config
    },(err)=>{
        // 当请求错误时弹框提示，或者做些其他的事情
        return Promise.reject(err)
    })


// 2.2 响应拦截===> 服务端处理好数据之后把数据返回给客户端(前端)，前端可以对数据进行处理
    axios.interceptors.response.use((res)=>{
        // 可以对数据做点什么 允许在数据返回给客户端前，修改响应的数据 如果执行返回data数据体需要res.data 否则全部返回res
        if(res.status!=200){
            return Promise.reject(res.data)
        }
        return{
            status:res.status,
            statusText:res.statusText,
            data:res.data
        }
    },(err)=>{
        // 当请求错误时弹框提示，或者做些其他的事情
        return Promise.reject(err)
    })
// 3·axios进行封装
function apiAxios(method,url,datas){
    // method==get  data==null
    return new Promise((resolve,reject)=>{
        axios({
            method:method,
            baseURL:baseURL,
            url:url,
            timeout:10000,
            params:method =='GET'?datas:null,
            data:method =='POST'?datas:null || "PUT"?datas:null || "DELETE"?datas:null,
        }).then((res)=>{//属于axios的
            // 返回成功时的响应数据
            resolve(res)

        }).catch(err=>{
            // 返回失败时的响应数据
            reject(err)
        })
    })
}
export default {
    // 抛出函数/方法
   getAxios:(url,datas)=>apiAxios('GET',url,datas),
    // getAxios:function(url,datas){
    //     return apiAxios('GET',url,datas)
    // },
   postAxios:(url,datas)=>apiAxios('POST',url,datas),
   putAxios:(url,datas)=>apiAxios('PUT',url,datas),
   delAxios:(url,datas)=>apiAxios('DELETE',url,datas)
}